/**
 * Copyright (c) 2009 blurredVision
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
 * associated documentation files (the "Software"), to deal in the Software without restriction, 
 * including without limitation the rights to use, copy, modify, merge, publish, distribute, 
 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is 
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all copies or 
 * substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT 
 * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 
 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT 
 * OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
#ifndef __GEOM_MATHUTILS_H__
#define __GEOM_MATHUTILS_H__

#include "geom/Vector.h"

namespace math {

// Linear interpolation of points val1 and val2 at position t
template <class T>
inline T lerp(T val1, T val2, float t)
{
	return ((1-t)*val1 + t*val2);
}


// Bilinear interpolation of points val1 and val2 at position t1 with the points val3 and val4 at position t2
template <class T>
inline T bilerp(T val1, T val2, T val3, T val4, float t1, float t2)
{
	// T a = lerp<T>(val1, val2, t1);
	// T b = lerp<T>(val3, val4, t1);
	// return lerp<T>(a, b, t2);
	return lerp<T>(lerp<T>(val1, val2, t1), lerp<T>(val3, val4, t1), t2);
}

DLL_EXPORT 
math::Vector3 RayPlaneIntersection(const math::Vector3& rayPos, const math::Vector3& rayDir, const math::Vector3& planeN, const math::Vector3 &planeP);

}

#endif
